import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from pprint import pprint

#六个常用定位
class TestCase:
    def __init__(self):
        self.driver = webdriver.Chrome()
        self.driver.get('https://www.baidu.com')

    def id(self):
        # 通过id定位元素
        # webelement就是所有通过selenium方法获取的标签对象
        # webelement.get_attribute(param)   #获取标签的属性
        # param: outerHTML   # 获取标签的源代码
        kw = self.driver.find_element(By.ID, 'kw')
        print(kw.get_attribute('outerHTML'))

        su = self.driver.find_element(By.ID, 'su')
        print(su.get_attribute('outerHTML'))

    def class_name(self):
        # 通过标签的class属性定位元素 By.CLASS_NAME
        s_ipt = self.driver.find_element(By.CLASS_NAME, 's_ipt')
        print(s_ipt.get_attribute('outerHTML'))

    def link_test(self):
        # 通过连接文本定位元素
        news=self.driver.find_element(By.LINK_TEXT,'新闻')
        print(news.get_attribute('outerHTML'))

    def partial_link_text(self):
        # 通过部分链接文本定位元素
        hao123=self.driver.find_element(By.PARTIAL_LINK_TEXT,'hao')
        print(hao123.get_attribute('outerHTML'))

    def tag_name(self):
        # 通过标签名称定位元素
        # driver.find_element()
        ipt=self.driver.find_element(By.TAG_NAME,'input')  #find_element是定位到页面的第一个input标签
        print(ipt.get_attribute('outerHTML'))

        # driver.find_elements()
        ipts=self.driver.find_elements(By.TAG_NAME,'input')  #是定位页面中所有的input标签
        pprint(ipts)
        print(len(ipts))
        print(ipts[7].get_attribute('outerHTML'))  #通过索引来定位具体input

        #也可以进行遍历
        # for item in ipts:
        #     print(item)

    def name(self):
        # 通过name属性定位元素
        rsv=self.driver.find_element(By.NAME,'rsv_bp')
        print(rsv.get_attribute('outerHTML'))

    def about_error(self):
        # driver.find_element()  匹配不到会抛出异常
        # self.driver.find_element(By.ID, 'abc')  # selenium.common.exceptions.NoSuchElementException

        # driver.find_elements()
        print(self.driver.find_element(By.CLASS_NAME, 'abcdd'))

    def quit(self):
        time.sleep(2)
        self.driver.quit()


if __name__ == '__main__':
    case=TestCase()
    case.id()
    # case.class_name()
    # case.link_test()
    # case.partial_link_text()
    # case.name()
    # case.tag_name()
    # case.name()
    # case.about_error()
    case.quit()

#

#xpath标签和属性定位
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')

# 定位元素 xpath标签和属性
kw = driver.find_element(By.XPATH, '//input[@id="kw"]')
print(kw.get_attribute('outerHTML'))

kw = driver.find_element(By.XPATH, '//input[@class="s_ipt"]')
print(kw.get_attribute('outerHTML'))

kw = driver.find_element(By.XPATH, '//*[@maxlength="255"]')
print(kw.get_attribute('outerHTML'))

input_lists = driver.find_elements(By.XPATH, '//input')
for ipt in input_lists:
    print(ipt.get_attribute('outerHTML'))

# 退出浏览器
driver.quit()



driver = webdriver.Chrome()
driver.get('https://www.baidu.com')

# xpath层级定位
ipt = driver.find_element(By.XPATH, '//form/span/input')
print(ipt.get_attribute('outerHTML'))

i = driver.find_element(By.XPATH, '//form/span/i[2]')
print(i.get_attribute('outerHTML'))

#退出浏览器
driver.quit()

#
# xpath逻辑运算
s_bir=driver.find_element(By.XPATH,'//*[@name="tj_briicon" and @class="s-bri c-font-normal c-color-t"]')
print(s_bir.get_attribute('outerHTML'))
# 退出浏览器
driver.quit()


# css选择器定位
# 通过nth-child() 定位input
ipt = driver.find_element(By.CSS_SELECTOR, '#form input:nth-child(11)')
print(ipt.get_attribute('outerHTML'))
driver.quit()
